
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;

/**
 *
 * @author Marwen
 */
public final class ListeOrdre extends javax.swing.JFrame {

    private Object[][] data;

    public ListeOrdre() {
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setTitle("Lise des ordres à exécuter ");
        initComponents();
        remplirTable(jTable1);
    }

    public void viderListe() {
        DefaultTableModel model = (DefaultTableModel) jTable1.getModel();
        int n = model.getRowCount();
        for (int i = 0; i < n; i++) {
            model.removeRow(n - i - 1);
        }
    }

    public void remplirTable(JTable jTable1) {
        try {
            viderListe();
            DefaultTableModel model = (DefaultTableModel) jTable1.getModel();
            this.setContentPane(jScrollPane1);
            this.jTable1.setRowHeight(35);
            DbManip.requete = "SELECT ordre.* FROM  ORDRE INNER JOIN CLIENT ON ORDRE.ID_CLIENT=CLIENT.ID_CLIENT WHERE client.MATRICULE='" + DbManip.traderId + "' and  ordre.STATUT ='attente'";
            //DbManip.requete = "select * FROM ordre where STATUT ='attente'";
            DbManip.executer(DbManip.requete);
            DbManip.afficher();
            DbManip.rs.beforeFirst();
            int m = DbManip.rsmd.getColumnCount();
            DbManip.rs.last();
            int n = DbManip.rs.getRow();
            int i = 0, j = 0;
            DbManip.rs.beforeFirst();
            data = new Object[n][m];
            while (DbManip.rs.next()) {
                int id_ordre = DbManip.rs.getInt("id_ordre");
                int id_action = DbManip.rs.getInt("id_action");
                String id_client = DbManip.rs.getString("id_client");
                String type = DbManip.rs.getString("type").substring(0, DbManip.rs.getString("type").indexOf("  "));
                int quantite = DbManip.rs.getInt("quantite");
                data[i][0] = id_ordre;
                data[i][1] = id_action;
                data[i][2] = id_client;
                data[i][3] = type;
                data[i][4] = quantite;
                data[i][5] = " Exécuter ";
                i++;
            }
            //Remplissage du JTabel pour l'affichage !!
            for (int l = 0; l < n; l++) {
                //recuperer  entreprise
                DbManip.requete = "SELECT entreprise.NOM_ENTREPRISE FROM  entreprise INNER JOIN action "
                                  + "ON action.ID_entreprise=entreprise.ID_entreprise WHERE action.id_action='" + data[l][1].toString() + "'";
                System.out.println("action=   " + DbManip.requete);
                DbManip.executer(DbManip.requete);
                //  DbManip.afficher();
                String entreprise = "";
                while (DbManip.rs.next()) {
                    entreprise = DbManip.rs.getString(1);
                    entreprise = entreprise.substring(0, entreprise.indexOf("  "));
                }
                String client = DbManip.recupererDeuxChampDUnId("client", "prenom_client", "NOM_CLIENT", "ID_CLIENT", data[l][2].toString());
                // String entreprise = DbManip.recupererChampDUnId("ENTREPRISE", "NOM_ENTREPRISE", "ID_ENTREPRISE", data[l][1].toString()).toString();
                model.addRow(new Object[]{data[l][0], entreprise, client, data[l][3], data[l][4], " Exécuter "});
            }
            // Changer l'apparence des boutons
            this.jTable1.getColumn("Exécution").setCellRenderer(new ButtonRenderer());
            //  Gestion des évenements
            this.jTable1.getColumn("Exécution").setCellEditor(new ButtonEditor(new JCheckBox()));
        }
        catch (SQLException ex) {
            Logger.getLogger(ListeOrdre.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    //******************** Classe de reglage Affichage 
    public class ButtonRenderer extends JButton implements TableCellRenderer {

        @Override
        public Component getTableCellRendererComponent(JTable table, Object value,
                                                       boolean isSelected, boolean isFocus,
                                                       int row, int col) {
            setText(" Exécuter ");
            return this;
        }
    }

    //*******************************Classe Gestion des évenements
    public class ButtonEditor extends DefaultCellEditor {

        protected JButton button;
        private ButtonListener bListener = new ButtonListener();

        /**
         * Constructeur avec une checkBox
         *
         * @param checkBox
         * @param count
         */
        public ButtonEditor(JCheckBox checkBox) {
            //Par défaut, ce type d'objet travaille avec un JCheckBox
            super(checkBox);
            //On crée à nouveau notre bouton
            button = new JButton();
            button.setOpaque(true);
            //On lui attribue un listener
            button.addActionListener(bListener);
        }

        // Cette méthode est invoquée lorsque clique sur le bouton concerné pour la première fois ! elle n'est plus invoquée 
        //si on la clique consécutivement !!  
        public Component getTableCellEditorComponent(JTable table, Object value,
                                                     boolean isSelected, int row, int column) {
            //On définit le numéro de lignes à notre listener
            bListener.setRow(row);
            //Idem pour le numéro de colonnes
            bListener.setColumn(column);
            //On passe aussi le tableau pour des actions potentielles
            bListener.setTable(table);
            //On réaffecte le libellé au bouton
            //button.setText( (value ==null) ? "" : value.toString() );
            button.setText(" Exécuter");
            return button;
        }

        class ButtonListener implements ActionListener {

            private int column, row;
            private JTable table;
            private int nbre = 0;
            private JButton button;

            public void setColumn(int col) {
                this.column = col;
            }

            public void setRow(int row) {
                this.row = row;
            }

            public void setTable(JTable table) {
                this.table = table;
            }

            public JButton getButton() {
                return this.button;
            }

            @Override
            public void actionPerformed(ActionEvent event) {

                int decison = JOptionPane.showConfirmDialog(new JFrame(), "Est-ce que vous voulez continuer?", "Choisisez une option", JOptionPane.YES_NO_OPTION);
                if (decison == 0) {
                    // Traitement de l'exécution de l'ordre                 
                    //id ordre
                    String id_ordre = table.getValueAt(row, 0).toString();
                    //id client
                    String idClient = data[row][2].toString();
                    //id action 
                    String idAction = data[row][1].toString();
                    // quantite
                    String quantite = table.getValueAt(row, 4).toString();
                    //type
                    String type = table.getValueAt(row, 3).toString();
                    //id portefeuille
                    String idPortefeuille = DbManip.recupererChampDUnId("Porte_feuille", "ID_PORTE_FEUILLE", "ID_CLIENT", idClient);
                    // changer l'état de attente ==> exécuté
                    DbManip.requete = "update ordre set STATUT='EXECUTE' , DATE_EXECUTION_ORDRE= TIMESTAMP '" + DbManip.date + "' where ID_ordre='" + id_ordre + "' ";
                    DbManip.executerUpdate(DbManip.requete);
                    //**************

                    //1er cas : ordre : Achat
                    if (type.equals("Achat")) {
                        try {

                            if (DbManip.existDsTable("PORTE_FEUILLE_ACTION", "ID_ACTION", idAction, "ID_PORTE_FEUILLE", idPortefeuille)) {
                                DbManip.requete = "select quantity from porte_feuille_action where ID_ACTION='"
                                                  + idAction + "' and ID_PORTE_FEUILLE='" + idPortefeuille + "'";
                                DbManip.executer(DbManip.requete);
                                String quantiteAnc = "0";
                                while (DbManip.rs.next()) {
                                    quantiteAnc = DbManip.rs.getString(1);
                                }
                                int n = Integer.valueOf(quantite) + Integer.valueOf(quantiteAnc);
                                DbManip.requete = "update PORTE_FEUILLE_ACTION set QUANTITY='" + n
                                                  + "' where ID_ACTION='" + idAction + "' and ID_PORTE_FEUILLE='" + idPortefeuille + "'";

                                DbManip.executerUpdate(DbManip.requete);

                            }
                            else //Ajouter Action au Porte Feuille
                            {
                                DbManip.requete = "insert into PORTE_FEUILLE_ACTION VALUES ('" + idAction + "','" + idPortefeuille + "','" + quantite + "')";
                                DbManip.executerUpdate(DbManip.requete);
                            }
                            // Mettre à jour la valeur du porte feuille
                            float montant = DbManip.ValeurPortefeuille(idPortefeuille); // fonction qui calcule le montant d'un porte feuille
                            String value = String.valueOf(montant);
                            value = value.replace(".", ",");
                            DbManip.requete = "insert into HISTORIQUE_PORTEFEUILLE VALUES ('" + DbManip.next_Id("HISTORIQUE_PORTEFEUILLE", "ID_HPF") + "','" + idPortefeuille + "','" + value + "', TIMESTAMP '" + DbManip.date + "')";
                            DbManip.executerUpdate(DbManip.requete);
                            JOptionPane.showMessageDialog(null, "Cet ordre a été bien éxécuté !", "Information", JOptionPane.INFORMATION_MESSAGE);
                            //dispose();
                            //ListeOrdre lo = new ListeOrdre();
                            //lo.setVisible(true);
                            DefaultTableModel mdl = (DefaultTableModel) jTable1.getModel();
                            mdl.removeRow(row);
                            




                        }
                        catch (SQLException ex) {
                            Logger.getLogger(ListeOrdre.class.getName()).log(Level.SEVERE, null, ex);
                        }
                    }
                    else { // vente
                        try {
                            // mettre a jour le nombre d'actions
                            DbManip.requete = "select quantity from porte_feuille_action where ID_ACTION='"
                                              + idAction + "' and ID_PORTE_FEUILLE='" + idPortefeuille + "'";
                            DbManip.executer(DbManip.requete);
                            String quantiteAnc = "0";
                            while (DbManip.rs.next()) {
                                quantiteAnc = DbManip.rs.getString(1);
                            }

                            int n = Integer.valueOf(quantiteAnc) - Integer.valueOf(quantite);

                            DbManip.requete = "update PORTE_FEUILLE_ACTION set QUANTITY='" + n
                                              + "' where ID_ACTION='" + idAction + "' and ID_PORTE_FEUILLE='" + idPortefeuille + "'";

                            DbManip.executerUpdate(DbManip.requete);

                            // Mettre à jour la valeur du porte feuille
                            float montant = DbManip.ValeurPortefeuille(idPortefeuille); // fonction qui calcule le montant d'un porte feuille
                            String value = String.valueOf(montant);
                            value = value.replace(".", ",");
                            System.out.println("next id=" + DbManip.next_Id("HISTORIQUE_PORTEFEUILLE", "ID_HPF"));
                            DbManip.requete = "insert into HISTORIQUE_PORTEFEUILLE VALUES ('" + DbManip.next_Id("HISTORIQUE_PORTEFEUILLE", "ID_HPF") + "','" + idPortefeuille + "','" + value + "', TIMESTAMP '" + DbManip.date + "')";
                            DbManip.executerUpdate(DbManip.requete);
                            JOptionPane.showMessageDialog(null, "Cet ordre a été bien éxécuté !", "Information", JOptionPane.INFORMATION_MESSAGE);
                            //dispose();
                            //ListeOrdre lo = new ListeOrdre();
                            //lo.setVisible(true);
                            DefaultTableModel mdl = (DefaultTableModel) jTable1.getModel();
                            mdl.removeRow(row);
                            
                            

                        }
                        catch (SQLException ex) {
                            Logger.getLogger(ListeOrdre.class.getName()).log(Level.SEVERE, null, ex);
                        }

                    }




                }

            }
        }
    }

    //***************************************************
    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        jTable1 = new javax.swing.JTable();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jTable1.setFont(new java.awt.Font("Times New Roman", 0, 12)); // NOI18N
        jTable1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "Id_Ordre", "Action", "Client", "Type", "Quantité", "Exécution"
            }
        ));
        jScrollPane1.setViewportView(jTable1);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 652, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(0, 0, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 153, javax.swing.GroupLayout.PREFERRED_SIZE)
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable jTable1;
    // End of variables declaration//GEN-END:variables
}
